Плохо! Плохо!:  0
Показано с 1 по 6 из 6

Тема: [MV] PrimitiveButton

  1. #1
    Бывалый Аватар для Darchan Kaen
    Информация о пользователе
    Регистрация
    17.06.2013
    Адрес
    Одесса
    Сообщений
    851
    Записей в дневнике
    3
    Репутация: 47 Добавить или отнять репутацию

    По умолчанию [MV] PrimitiveButton

    Название плагина: DKR_PrimitiveButton

    Автор: Yoji Ojima, DarchanKaen

    Версия: 2.0

    Дата выхода:
    Версия 3.0 - 19.03.2022
    Версия 2.0 - 19.08.2021
    Версия 1.0 - 18.08.2021

    Описание плагина:
    Плагин позволяет отображать на экране кнопку в виде картинки / текста / текста на фоне картинки, вызывать Общее событии при клике ЛКМ на ней, и трекать наведение мышки на картинку ("hover"). Также можно указывать переменную, в которую записывается номер(id) кликнутой картинки.

    Нюансы:
    1. Если в текстовой кнопке указанно переменная, то при ее изменении значение в тексте кнопки не обновляется - для обновления пересоздайте кнопку.
    2. Если на одно и то же место (x, y) ставить несколько кнопок, то при нажатии вызывается последняя.
    3. После клика ЛКМ персонаж совершает движение в сторону картинки.
    4. Трекинг работает в экспериментальном режиме, доступен только для последней показанной кнопки и, теоретически, может снижать FPS на 1-5 пунктов(!).

    Использование плагина:
    На кнопку действуют все стандартные команды картинок.
    Удаляется кнопка командой мейкера "Удалить картинку" по ее номеру.

    Параметры плагина:
    В параметрах плагина можно указать, включить ли трекинг наведения курсора мыши на картинку ("hover"), в какой свитч записывать что курсор наведен и в какую переменную записывать номер картинки.

    Команды (в эвенте, в команде "Скрипт"):

    DKR.PrimitiveButton.displayTextButton(buttonText, pictureId, pictureX, pictureY, commonEventId); - выводит "текстовую" кнопку.

    или

    DKR.PrimitiveButton.displayImageButton(pictureName , pictureId, pictureX, pictureY, commonEventId); - выводит кнопку-картинку.

    или

    DKR.PrimitiveButton.displayTextButtonWithBackgorun d(buttonText, pictureName, pictureId, pictureX, pictureY, pictureXOffset, pictureYOffset, commonEventId); - выводит "текстовую" кнопку на фоне картинки.

    а также DKR.PrimitiveButton.hoverTrackingOnOff(isTrackingO n) - включить / выключение трекинга.

    где:

    buttonText - текст, допускающий контрольные символы (ставьте \\ вместо \);
    pictureName - название файла картинки в папке \img\pictures БЕЗ .png;
    pictureId - номер картинки;
    pictureX, pictureY - координаты X и Y картинки;
    pictureXOffset, pictureYOffset - промежутки между левым и верхним краем картинки и краями "текстовой" кнопки (для красоты);
    commonEventId - номер Общего события;
    isTrackingOn - включить (true) / выключить (false) трекинг на картинку / кнопку.

    Код:
    Спойлер Код плагина, версия 3.0:
    Код:
    /*:
     *-----------------------------------------------------------------------------
     *  DKR PrimitiveButton
     *-----------------------------------------------------------------------------
     *  For: RPGMAKER MV
     *  DKR_PrimitiveButton_3.js
     *-----------------------------------------------------------------------------
     *  19.03.2022 - Версия 3.0.0
     *  19.08.2021 - Версия 2.0.0
     *  18.08.2021 - Версия 1.0.0
     *-----------------------------------------------------------------------------
     * Поставляется AS-IS.
     * Вся ответственность при использовании - на Пользователе!
     *-----------------------------------------------------------------------------
     *-----------------------------------------------------------------------------
     * @author Yoji Ojima, DarchanKaen
     * @target MV
     * @plugindesc (v.3.0.0) Плагин позволяет отображать на экране кнопку в виде картинки / текста / 
     * текста на фоне картинки, вызывать Общее событии при ЛКМ на ней (и кое-что еще).
     * @help
     *   DKR PrimitiveButton_3
     * ----------------------------------------------------------------------------
     * ---Общая информация:
     * Плагин позволяет отображать на экране кнопку в виде картинки / текста / текста на фоне картинки, 
     * вызывать Общее событии при клике ЛКМ на ней, и трекать наведение мышки на картинку ("hover").
     *
     * Трекинг работает в экспериментальном режиме и, теоретически, может снижать FPS на 1-5 пунктов(!).
     *
     * На кнопку действуют все стандартные команды картинок. 
     * Удаляется кнопка командой мейкера "Удалить картинку" по ее номеру; при использовании команды ... displayTextButtonWithBackgorund...
     * нужно удалять номер картинки(фон) и номер картинки + 1 (сама кнопка).
     *
     * --Команды (для раздела "Скрипт"):
     * DKR.PrimitiveButton.displayTextButton(buttonText, pictureId, pictureX, pictureY, commonEventId); 
     * - выводит "текстовую" кнопку.
     *
     * DKR.PrimitiveButton.displayImageButton(pictureName, pictureId, pictureX, pictureY, commonEventId);
     * - выводит кнопку-картинку.
     *
     * DKR.PrimitiveButton.displayTextButtonWithBackgorund(buttonText, pictureName, pictureId, pictureX, pictureY, pictureXOffset, pictureYOffset, commonEventId);
     * - выводит "текстовую" кнопку на фоне картинки.
     *
     * DKR.PrimitiveButton.hoverTrackingOnOff(isTrackingOn) - включить / выключение трекинга.
     *
     * где:
     * buttonText - текст, допускающий контрольные символы (ставьте \\ вместо \);
     * pictureName - название файла картинки в папке \img\pictures БЕЗ .png;
     * pictureId - номер картинки;
     * pictureX, pictureY - координаты X и Y картинки;
     * pictureXOffset, pictureYOffset - промежутки между левым и верхним краем картинки и краями "текстовой" кнопки (для красоты);
     * commonEventId - номер Общего события;
     * isTrackingOn - включить (true) / выключить (false) трекинг на картинку / кнопку.
     *
     * ----------------------------------------------------------------------------
     * @param idOfClickedPictureVarId
     * @type variable
     * @desc Номер переменной для хранения номера (id)картинки / кнопки, по которой сделан клик
     * @default 4
     *
     * @param hoverTrackingIsOn
     * @type boolean
     * @desc Включен ли трекинг факта наведения на кнопку или картинку (теоретически может уменьшать FPS!).
     * @default false
     * 
     * @param hoverTrackingIsHoverSwitchId
     * @type switch
     * @desc Номер переключателя для хранения факта наведения на картинку / кнопку.
     * @default 5
     *
     * @param hoverTrackingPictureIdVarId
     * @type variable
     * @desc Номер переменной для хранения номера (id)картинки / кнопки, на которой наведение.
     * @default 5
     *
     */
    
    
    
    var Imported = Imported || {};
    Imported.DKR_PrimitiveButton = true;
    
    var DKR = DKR || {};          
    DKR.PrimitiveButton = DKR.PrimitiveButton || {}; 
    DKR.PrimitiveButton.version = 3.0;
    
    DKR.PrimitiveButton.parameters = PluginManager.parameters('DKR_PrimitiveButton_3');
    
    
    (() => {
    	
    	
    	
    //--------DATA: BEGIN	
    	DKR.PrimitiveButton.idOfClickedPictureVarId = Number(DKR.PrimitiveButton.parameters['idOfClickedPictureVarId']) || 4;
    	DKR.PrimitiveButton.hoverTrackingIsOn = (DKR.PrimitiveButton.parameters['hoverTrackingIsOn']=== 'true') ? true : false;
    	DKR.PrimitiveButton.hoverTrackingIsHoverSwitchId = Number(DKR.PrimitiveButton.parameters['hoverTrackingIsHoverSwitchId']) || 5;
    	DKR.PrimitiveButton.hoverTrackingPictureIdVarId = Number(DKR.PrimitiveButton.parameters['hoverTrackingPictureIdVarId']) || 5;
    
    	const pictureOrigin = 0;
    	const pictureScaleX = 100;
    	const pictureScaleY = 100;
    	const pictureOpacity = 255;
    	const pictureBlendMode = 0;	
    //--------DATA: END	
    
    
    
    //--------WINDOW BASE BLOCK: BEGIN
    Window_Base.prototype.textSizeEx = function(text) {
        this.resetFontSettings();
    	
        var textState = { index: 0, x: 0, y: 0, left: 0 };
        textState.text = this.convertEscapeCharacters(text);
        textState.height = this.calcTextHeight(textState, false);
        textState.drawing = false;
    	
    	let tWidth = this.textWidth(text);
    	let hHeight = this.calcTextHeight(textState, false);
    	let wCoeff = 1.25;
    	if(tWidth < 90){
    		wCoeff = 2;
    	}else if(tWidth < 130){
    		wCoeff = 1.45;
    	}
    	tWidth = Math.ceil( tWidth * wCoeff );
    	hHeight = Math.ceil( hHeight * 2 );
    	return { width: tWidth, height: hHeight };
    };
    //--------WINDOW BASE BLOCK: BEGIN
    
    
    
    //--------TOUCH INPUT BLOCK: BEGIN
    TouchInput.isHovered = function() {
        return this.__hovered;
    };
    //--------TOUCH INPUT BLOCK: END
    
    	
    	
    //--------TEXT PICTURE BLOCK: BEGIN
    	let textPictureText = "";
    
    
        const _Game_Picture_show = Game_Picture.prototype.show;
        Game_Picture.prototype.show = function() {
            _Game_Picture_show.apply(this, arguments);
            if (this._name === "" && textPictureText) {
                this.mzkp_text = textPictureText;
                this.mzkp_textChanged = true;
                textPictureText = "";
            }
        };
    
    
        const _Sprite_Picture_destroy = Sprite_Picture.prototype.destroy;
        Sprite_Picture.prototype.destroy = function() {
            destroyTextPictureBitmap(this.bitmap);
            _Sprite_Picture_destroy.apply(this, arguments);
        };
    
    
        const _Sprite_Picture_updateBitmap = Sprite_Picture.prototype.updateBitmap;
        Sprite_Picture.prototype.updateBitmap = function() {
            _Sprite_Picture_updateBitmap.apply(this, arguments);
            if (this.visible && this._pictureName === "") {
                const picture = this.picture();
                const text = picture ? picture.mzkp_text || "" : "";
                const textChanged = picture && picture.mzkp_textChanged;
                if (this.mzkp_text !== text || textChanged) {
                    this.mzkp_text = text;
                    destroyTextPictureBitmap(this.bitmap);
                    this.bitmap = createTextPictureBitmap(text);
                    picture.mzkp_textChanged = false;
                }
            } else {
                this.mzkp_text = "";
            }
        };
    
    
        function createTextPictureBitmap(text) {
            const tempWindow = new Window_Base(new Rectangle());
            const size = tempWindow.textSizeEx(text);
    		tempWindow.padding = 0;
            tempWindow.move(0, 0, size.width, size.height);
            tempWindow.createContents();
            tempWindow.drawTextEx(text, 0, 0, 0);
            const bitmap = tempWindow.contents;
            tempWindow.contents = null;
            tempWindow.destroy();
            bitmap.mzkp_isTextPicture = true;
            return bitmap;
        }
    
    
        function destroyTextPictureBitmap(bitmap) {
            if (bitmap && bitmap.mzkp_isTextPicture) {
                bitmap.clear();
            }
        }
    	
    	
    	const displayTextPicture = function(pictureText){
    		textPictureText = String(pictureText);
    	}
    //--------TEXT PICTURE BLOCK: END
    	
    	
    	
    //--------BUTTON PICTURE BLOCK: BEGIN
    	
    	//----CHANGE PICTURE SPRITE AS MZ CLICKABLE SPRITE
    	
    	Sprite_Picture.prototype.initialize = function(pictureId) {
    		Sprite.prototype.initialize.call(this);
    		this._pictureId = pictureId;
    		this._pictureName = '';
    		this._isPicture = true;
    		this._pressed = false;
    		this._hovered = false;
    		this.update();
    	};
    		
    	
    	Sprite_Picture.prototype.isClickEnabled = function() {
    		return this.worldVisible;
    	};
    		
    		
    	Sprite_Picture.prototype.processTouch = function() {
    		if (this.isClickEnabled()) {
    			if (this.isBeingTouched()) {
    					if(true === DKR.PrimitiveButton.hoverTrackingIsOn){
    						$gameSwitches.setValue(DKR.PrimitiveButton.hoverTrackingIsHoverSwitchId, true);
    						$gameVariables.setValue(DKR.PrimitiveButton.hoverTrackingPictureIdVarId, this._pictureId);
    					}
    				if (!this._hovered && TouchInput.isHovered()) {
    					this._hovered = true;
    					this.onMouseEnter();
    				}
    				if (TouchInput.isTriggered()) {
    					this._pressed = true;
    					this.onPress();
    				}
    			} else {
    				if(true === DKR.PrimitiveButton.hoverTrackingIsOn){
    						$gameSwitches.setValue(DKR.PrimitiveButton.hoverTrackingIsHoverSwitchId, false);
    						$gameVariables.setValue(DKR.PrimitiveButton.hoverTrackingPictureIdVarId, -1);
    				}
    				if (this._hovered) {
    					this.onMouseExit();
    				}
    				this._pressed = false;
    				this._hovered = false;
    			}
    			if (this._pressed && TouchInput.isReleased()) {
    				this._pressed = false;
    				this.onClick();
    			}
    		} else {
    			this._pressed = false;
    			this._hovered = false;
    		}
    		
    	};
    		
    	
    	Sprite_Picture.prototype.isPressed = function() {
    		return this._pressed;
    	};
    
    
    	Sprite_Picture.prototype.isClickEnabled = function() {
    		const picture = this.picture();
    		return picture && picture.mzkp_commonEventId && !$gameMessage.isBusy();
    	};
    
    
    	Sprite_Picture.prototype.isBeingTouched = function() {
    		const touchPos = new Point(TouchInput.x, TouchInput.y);
    		const localPos = this.worldTransform.applyInverse(touchPos);
    		return this.hitTest(localPos.x, localPos.y);
    	};
    
    
    	Sprite_Picture.prototype.hitTest = function(x, y) {
    		const rect = new Rectangle(
    			-this.anchor.x * this.width,
    			-this.anchor.y * this.height,
    			this.width,
    			this.height
    		);
    		return rect.contains(x, y);
    	};
    	
    	
    	Sprite_Picture.prototype.onMouseEnter = function() {
    		//
    	};
    
    
    	Sprite_Picture.prototype.onMouseExit = function() {
    		//
    	};
    
    
    	Sprite_Picture.prototype.onPress = function() {
    		//
    	};
    
    
    	Sprite_Picture.prototype.onClick = function() {
    		//- basic MZ: NONE
    		if( this.picture().mzkp_commonEventId > 0){
    			$gameVariables.setValue(DKR.PrimitiveButton.idOfClickedPictureVarId, this._pictureId);
    			$gameTemp.reserveCommonEvent(this.picture().mzkp_commonEventId);
    		}
    		
    	};	
    		
    	
    	DKR.PrimitiveButton.__update = Sprite_Picture.prototype.update;
    	Sprite_Picture.prototype.update = function(){
    		DKR.PrimitiveButton.__update.call(this);
    		this.processTouch();
    	}
    	//-
    	
    	
    	
    	//----BUTTON PICTURE LOGIC
    	Spriteset_Base.prototype.mzkp_isAnyPicturePressed = function() {
            return this._pictureContainer.children.some(sprite =>
                sprite.isPressed()
            );
        };
    	
    	
    	const _Scene_Map_isAnyButtonPressed = Scene_Map.prototype.isAnyButtonPressed;
    	
    	
        Scene_Map.prototype.isAnyButtonPressed = function() {
            return (
                _Scene_Map_isAnyButtonPressed.apply(this, arguments) ||
                this._spriteset.mzkp_isAnyPicturePressed()
            );
        };
    	
    	
    	const displayButtonPicture = function(picId, cEId){
    		const pictureId = picId;
    		const commonEventId = cEId;
    		const picture = $gameScreen.picture(pictureId);
    		if (picture){
    			picture.mzkp_commonEventId = commonEventId;
    		}
    	}
    	//-
    //--------BUTTON PICTURE BLOCK: END
    
    
    
    //--------DISPLAY PICTURE BLOCK: BEGIN	
    	const displayPrimitiveButton = function(isTextButtonMode, buttonText, pictureId, pictureName, pictureX, pictureY, commonEventId){
    		if(true === isTextButtonMode){
    			$gameScreen.showPicture(pictureId, '', pictureOrigin, pictureX, pictureY, pictureScaleX, pictureScaleY, pictureOpacity, pictureBlendMode);
    			displayTextPicture(buttonText);
    		}else{
    			$gameScreen.showPicture(pictureId, pictureName, pictureOrigin, pictureX, pictureY, pictureScaleX, pictureScaleY, pictureOpacity, pictureBlendMode);
    		}
    		displayButtonPicture(pictureId, commonEventId);
    		
    			//-second, becouse some strange bug 
    		if(true === isTextButtonMode){
    			$gameScreen.showPicture(pictureId, '', pictureOrigin, pictureX, pictureY, pictureScaleX, pictureScaleY, pictureOpacity, pictureBlendMode);
    			displayTextPicture(buttonText);
    		}else{
    			$gameScreen.showPicture(pictureId, pictureName, pictureOrigin, pictureX, pictureY, pictureScaleX, pictureScaleY, pictureOpacity, pictureBlendMode);
    		}
    		displayButtonPicture(pictureId, commonEventId);
    	}
    //--------DISPLAY PICTURE BLOCK: END	
    	
    	
    //--------COMMANDS: BEGIN
    	DKR.PrimitiveButton.displayTextButton = function(buttonText, pictureId, pictureX, pictureY, commonEventId){
    		displayPrimitiveButton(true, buttonText, pictureId, '', pictureX, pictureY, commonEventId);
    	}
    	
    	DKR.PrimitiveButton.displayImageButton = function(pictureName, pictureId, pictureX, pictureY, commonEventId){
    		displayPrimitiveButton(false, '', pictureId, pictureName, pictureX, pictureY, commonEventId);
    	}
    	
    	DKR.PrimitiveButton.displayTextButtonWithBackgorund = function(buttonText, pictureName, pictureId, pictureX, pictureY, pictureXOffset, pictureYOffset, commonEventId){
    		$gameScreen.showPicture(pictureId, pictureName, pictureOrigin, pictureX, pictureY, pictureScaleX, pictureScaleY, pictureOpacity, pictureBlendMode);
    		displayPrimitiveButton(true, buttonText, pictureId + 1, '', (pictureX + pictureXOffset), (pictureY + pictureYOffset), commonEventId);
    	}
    	
    	DKR.PrimitiveButton.hoverTrackingOnOff = function(isTrackingOn){
    		DKR.PrimitiveButton.hoverTrackingIsOn = isTrackingOn;
    	}
    //--------COMMANDS: END
    
    
    	
    })();
    
    
    	
    })();


    Загрузка:
    Спойлер Ссылки на загрузку версии 3.0:


    Условия поставки плагина:
    Поставляется AS-IS.
    Вся ответственность при использовании - на Пользователе!
    !

    Совместимость:
    Плагин существенно меняет внутреннюю логику MV по работе с картинками, чуть приближая к MZ.
    Совместимость с другими плагинами, в особенности с плагинами на кнопки / клики мыши, не гарантируется.

    Для чего можно использовать:
    Для мини-игр (идлов, кликеров и подобных), если не хотите тянуть более комплексные плагины на GUI.

    Спойлер Видео-демонстрация основных возможностей плагина (версия 2.0):



    Спойлер Лирическое отступление:
    Плагин совмещает в себе функциональность стандартных плагинов MZ TextPicture и PictureButton, за авторством Yoji Ojima...адаптированный под МВ. Потому он и на первом месте в перечне авторов.
    Написал, т.к. мне удобнее использовать такой вариант (именно текстовую кнопку), а не тащить более комплексные (но и функциональные) плагины.
    Может, кому пригодится.


    P.S:
    Плагин предполагается для использования вне боя (на карте) и в бою не тестировался.
    Последний раз редактировалось Darchan Kaen; 19.03.2022 в 11:59. Причина: Версия 3.0

  2. #2
    Создатель Аватар для Рольф
    Информация о пользователе
    Регистрация
    14.04.2008
    Адрес
    Южно- Сахалинск/Пенза
    Сообщений
    10,145
    Записей в дневнике
    2
    Репутация: 108 Добавить или отнять репутацию

    По умолчанию

    Опять без картинок. Если есть возможность кинь пару картинок, нагляднее будет лучше.

  3. #3
    Бывалый Аватар для Darchan Kaen
    Информация о пользователе
    Регистрация
    17.06.2013
    Адрес
    Одесса
    Сообщений
    851
    Записей в дневнике
    3
    Репутация: 47 Добавить или отнять репутацию

    По умолчанию

    Цитата Сообщение от Рольф Посмотреть сообщение
    Опять без картинок. Если есть возможность кинь пару картинок, нагляднее будет лучше.
    Хз как это показать картинками, добавил видео.

    Пришлось прикрутить к МВ кусок логики МЗ, видимо теперь за мной приедут 6 крепких японцев. =(
    Приятно удивлен, что под капотом МЗ изменений все таки больше, чем кажется на первый взгляд (например, в МЗ есть отдельная логика для кликабельных / ховерных картинок - чего в МВ нет).

    Плагин обновлен до версии 2.0.
    Исправлены баги:
    1. Баг, при котором в случае использования "текстовой" кнопки некорректно считались ее габариты.
    Добавлены функции:
    1. Добавлена возможность вывода текста на фоне картинки, что визуально приближает к "классической" кнопке.
    2. Добавлена экспериментальная возможность трекать наведение курсора мышки на кнопку и записывать сей факт в переключатель, а номер картинки - в переменную.
    "Но есть нюанс"(с) , о котором написал в топике.

    Все ссылки и код версии 1.0 удалены.
    Последний раз редактировалось Darchan Kaen; 19.08.2021 в 00:00.

  4. #4
    Бывалый Аватар для Darchan Kaen
    Информация о пользователе
    Регистрация
    17.06.2013
    Адрес
    Одесса
    Сообщений
    851
    Записей в дневнике
    3
    Репутация: 47 Добавить или отнять репутацию

    По умолчанию

    Может кому-то пригодится, для экспериментов.
    Все таки вызывать два плагина (TextButton и ButtonPicture) может быть неудобно...
    Короче говоря, версия для MZ.

    Функционал такой же, как на MV. Трекинг наведения убран, есть только клик ЛКМ.
    Ну и 90% кода взято у Yoji Ojima, аве ему/ей.

    Спойлер Код плагина MZ, версия 1.0.1:

    Код:
    /*:
     *-----------------------------------------------------------------------------
     *  DKR PrimitiveButton MZ
     *-----------------------------------------------------------------------------
     *  For: RPGMAKER MZ
     *  DKR_PrimitiveButton_MZ.js
     *-----------------------------------------------------------------------------
     *  10.01.2022 - Версия 1.0.1
     *-----------------------------------------------------------------------------
     * Поставляется AS-IS.
     * Вся ответственность при использовании - на Пользователе!
     *-----------------------------------------------------------------------------
     *-----------------------------------------------------------------------------
     * @author Yoji Ojima, DarchanKaen
     * @target MZ
     * @plugindesc (v.1.0.0) Плагин позволяет отображать на экране кнопку в виде картинки / текста / 
     * текста на фоне картинки, вызывать Общее событии при ЛКМ на ней (и кое-что еще).
     * @help
     *   DKR PrimitiveButton_MZ
    * ----------------------------------------------------------------------------
     * ---Общая информация:
     * Плагин позволяет отображать на экране кнопку в виде картинки / текста / текста на фоне картинки, 
     * вызывать Общее событии при клике ЛКМ на ней.
     *
     * На кнопку действуют все стандартные команды картинок. 
     * Удаляется кнопка командой мейкера "Удалить картинку" по ее номеру; при использовании команды ... displayTextButtonWithBackground...
     * нужно удалять номер картинки(фон) и номер картинки + 1 (сама кнопка).
     *
     * --Команды (для раздела "Скрипт"):
     * DKR.PrimitiveButtonMZ.displayTextButton(buttonText, pictureId, pictureX, pictureY, commonEventId); 
     * - выводит "текстовую" кнопку.
     *
     * DKR.PrimitiveButtonMZ.displayImageButton(pictureName, pictureId, pictureX, pictureY, commonEventId);
     * - выводит кнопку-картинку.
     *
     * DKR.PrimitiveButtonMZ.displayTextButtonWithBackground(buttonText, pictureName, pictureId, pictureX, pictureY, pictureXOffset, pictureYOffset, commonEventId);
     * - выводит "текстовую" кнопку на фоне картинки.
     *
     *
     * где:
     * buttonText - текст, допускающий контрольные символы (ставьте \\ вместо \);
     * pictureName - название файла картинки в папке \img\pictures БЕЗ .png;
     * pictureId - номер картинки;
     * pictureX, pictureY - координаты X и Y картинки;
     * pictureXOffset, pictureYOffset - промежутки между левым и верхним краем картинки и краями "текстовой" кнопки (для красоты);
     * commonEventId - номер Общего события;
     *
     * ----------------------------------------------------------------------------
     * @param idOfClickedPictureVarId
     * @type variable
     * @desc Номер переменной для хранения номера(id) картинки / кнопки, по которой сделан клик
     * @default 4
     *
     */
    
    
     
    var Imported = Imported || {};
    Imported.DKR_PrimitiveButtonMZ = true;
    
    var DKR = DKR || {};          
    DKR.PrimitiveButtonMZ = DKR.PrimitiveButtonMZ || {}; 
    DKR.PrimitiveButtonMZ.version = 1.0;
    
    DKR.PrimitiveButtonMZ.parameters = PluginManager.parameters('DKR_PrimitiveButton_MZ');
    
    
    (() => {
    	
    	
    	
    //--------DATA: BEGIN	
    	DKR.PrimitiveButtonMZ.idOfClickedPictureVarId = Number(DKR.PrimitiveButtonMZ.parameters['idOfClickedPictureVarId']) || 4;
    
    	const pictureOrigin = 0;
    	const pictureScaleX = 100;
    	const pictureScaleY = 100;
    	const pictureOpacity = 255;
    	const pictureBlendMode = 0;	
    //--------DATA: END	
    
    	
    //--------TEXT AND BUTTON PICTURE BLOCK: BEGIN
    
    	//----TEXT PICTURE LOGIC: 
    	let textPictureText = "";
    
        const _Game_Picture_show = Game_Picture.prototype.show;
        Game_Picture.prototype.show = function() {
            _Game_Picture_show.apply(this, arguments);
            if (this._name === "" && textPictureText) {
                this.mzkp_text = textPictureText;
                this.mzkp_textChanged = true;
                textPictureText = "";
            }
        };
    
        const _Sprite_Picture_destroy = Sprite_Picture.prototype.destroy;
        Sprite_Picture.prototype.destroy = function() {
            destroyTextPictureBitmap(this.bitmap);
            _Sprite_Picture_destroy.apply(this, arguments);
        };
    
        const _Sprite_Picture_updateBitmap = Sprite_Picture.prototype.updateBitmap;
        Sprite_Picture.prototype.updateBitmap = function() {
            _Sprite_Picture_updateBitmap.apply(this, arguments);
            if (this.visible && this._pictureName === "") {
                const picture = this.picture();
                const text = picture ? picture.mzkp_text || "" : "";
                const textChanged = picture && picture.mzkp_textChanged;
                if (this.mzkp_text !== text || textChanged) {
                    this.mzkp_text = text;
                    destroyTextPictureBitmap(this.bitmap);
                    this.bitmap = createTextPictureBitmap(text);
                    picture.mzkp_textChanged = false;
                }
            } else {
                this.mzkp_text = "";
            }
        };
    
        function createTextPictureBitmap(text) {
            const tempWindow = new Window_Base(new Rectangle());
            const size = tempWindow.textSizeEx(text);
    		tempWindow.padding = 0;
            tempWindow.move(0, 0, size.width, size.height);
            tempWindow.createContents();
            tempWindow.drawTextEx(text, 0, 0, 0);
            const bitmap = tempWindow.contents;
            tempWindow.contents = null;
            tempWindow.destroy();
            bitmap.mzkp_isTextPicture = true;
            return bitmap;
        }
    
        function destroyTextPictureBitmap(bitmap) {
            if (bitmap && bitmap.mzkp_isTextPicture) {
                bitmap.clear();
            }
        }
    	
    	const displayTextPicture = function(pictureText){
    		textPictureText = String(pictureText);
    	}
    
    
    
        //----BUTTON PICTURE LOGIC: 
    	Sprite_Picture.prototype.isClickEnabled = function() {
            const picture = this.picture();
            return picture && picture.mzkp_commonEventId && !$gameMessage.isBusy();
        };
    
        Sprite_Picture.prototype.onClick = function() {
            if( this.picture().mzkp_commonEventId > 0){
    			$gameVariables.setValue(DKR.PrimitiveButtonMZ.idOfClickedPictureVarId, this._pictureId);
    			$gameTemp.reserveCommonEvent(this.picture().mzkp_commonEventId);
    		}
        };
    
        Spriteset_Base.prototype.mzkp_isAnyPicturePressed = function() {
            return this._pictureContainer.children.some(sprite =>
                sprite.isPressed()
            );
        };
    
        const _Scene_Map_isAnyButtonPressed = Scene_Map.prototype.isAnyButtonPressed;
        Scene_Map.prototype.isAnyButtonPressed = function() {
            return (
                _Scene_Map_isAnyButtonPressed.apply(this, arguments) ||
                this._spriteset.mzkp_isAnyPicturePressed()
            );
        };
    	
    	const displayButtonPicture = function(picId, cEId){
    		const pictureId = picId;
    		const commonEventId = cEId;
    		const picture = $gameScreen.picture(pictureId);
    		if (picture){
    			picture.mzkp_commonEventId = commonEventId;
    		}
    	}
    //--------TEXT AND BUTTON PICTURE BLOCK: BEGIN
    
    
    	
    //--------DISPLAY PICTURE BLOCK: BEGIN	
    	const displayPrimitiveButton = function(isTextButtonMode, buttonText, pictureId, pictureName, pictureX, pictureY, commonEventId){
    		if(true === isTextButtonMode){
    			$gameScreen.showPicture(pictureId, '', pictureOrigin, pictureX, pictureY, pictureScaleX, pictureScaleY, pictureOpacity, pictureBlendMode);
    			displayTextPicture(buttonText);
    		}else{
    			$gameScreen.showPicture(pictureId, pictureName, pictureOrigin, pictureX, pictureY, pictureScaleX, pictureScaleY, pictureOpacity, pictureBlendMode);
    		}
    		displayButtonPicture(pictureId, commonEventId);
    		
    			//-second, becouse some strange bug 
    		if(true === isTextButtonMode){
    			$gameScreen.showPicture(pictureId, '', pictureOrigin, pictureX, pictureY, pictureScaleX, pictureScaleY, pictureOpacity, pictureBlendMode);
    			displayTextPicture(buttonText);
    		}else{
    			$gameScreen.showPicture(pictureId, pictureName, pictureOrigin, pictureX, pictureY, pictureScaleX, pictureScaleY, pictureOpacity, pictureBlendMode);
    		}
    		displayButtonPicture(pictureId, commonEventId);
    	}
    //--------DISPLAY PICTURE BLOCK: END		
    	
    	
    	
    //--------COMMANDS: BEGIN
    	DKR.PrimitiveButtonMZ.displayTextButton = function(buttonText, pictureId, pictureX, pictureY, commonEventId){
    		displayPrimitiveButton(true, buttonText, pictureId, '', pictureX, pictureY, commonEventId);
    	}
    	
    	DKR.PrimitiveButtonMZ.displayImageButton = function(pictureName, pictureId, pictureX, pictureY, commonEventId){
    		displayPrimitiveButton(false, '', pictureId, pictureName, pictureX, pictureY, commonEventId);
    	}
    	
    	DKR.PrimitiveButtonMZ.displayTextButtonWithBackground = function(buttonText, pictureName, pictureId, pictureX, pictureY, pictureXOffset, pictureYOffset, commonEventId){
    		$gameScreen.showPicture(pictureId, pictureName, pictureOrigin, pictureX, pictureY, pictureScaleX, pictureScaleY, pictureOpacity, pictureBlendMode);
    		displayPrimitiveButton(true, buttonText, pictureId + 1, '', (pictureX + pictureXOffset), (pictureY + pictureYOffset), commonEventId);
    	}
    //--------COMMANDS: END
    
    	
    	
    })();


    Спойлер Ссылка на загрузку плагина для MZ, версия 1.0.1:


    Пришел к выводу, что некоторые вещи проще (пробовать) делать картинками, чем эвентами.

    upd:
    Нашел баг, перезалил код и файл версии 1.0.1.
    Последний раз редактировалось Darchan Kaen; 11.01.2022 в 00:56. Причина: Хотфикс 1.0.1

  5. #5
    Познающий Аватар для VarVarKa
    Информация о пользователе
    Регистрация
    27.03.2016
    Сообщений
    353
    Записей в дневнике
    1
    Репутация: 44 Добавить или отнять репутацию

    По умолчанию

    При использование текстовой кнопки (с фоном и без) "съедаются" две последние буквы
    Спойлер :



    Можно, конечно, добавить пробелов, но если добавить их 2, то часть "с" также не отображается, а если 3 - кнопка срабатывает при клике мимо кнопки(справа). Это расстояние небольшое, но оно есть)
    А ещё, лично мне, не хватает в настройках плагина выбор переменной для записи номера картинки, на которую кликаешь

  6. #6
    Бывалый Аватар для Darchan Kaen
    Информация о пользователе
    Регистрация
    17.06.2013
    Адрес
    Одесса
    Сообщений
    851
    Записей в дневнике
    3
    Репутация: 47 Добавить или отнять репутацию

    По умолчанию

    VarVarKa, спасибо, исправил. Нажатие на пикселей на 10 выезжает в право, но точнее сделать я не смог.
    Запись номера картинки в переменную добавил еще во время "Злого конкурса", но не апдейтил - думал никому это не нужно.
    Странно, как я проглядел обрезку текста. =(

    Вышла версия 3.0:
    Фиксы:
    Скорректировано отображения текста небольшого размера.
    Новый функционал:
    Теперь в настройках плагина можно указывать переменную, в которую записывается номер картинки текста/изображения, на которой был клик

    Обратите внимание, в данном плагине функция ховера все еще в "экспериментальном режиме" и ее использовать не рекомендуется!
    Последний раз редактировалось Darchan Kaen; 19.03.2022 в 12:18. Причина: Перефраз

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
[MV] PrimitiveButton